home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-04-21 | 15.1 KB | 495 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: FWStrToo.cpp
- // Release Version: $ 1.0d1 $
- //
- // Creation Date: 3/28/94
- //
- // Copyright: © 1994 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #ifndef FWPRISTR_H
- #include "FWPriStr.h"
- #endif
-
- #ifndef FWPRIDEB_H
- #include "FWPriDeb.h"
- #endif
-
- #ifndef FWSTRTOO_H
- #include "FWStrToo.h"
- #endif
-
- #ifndef FWMATH_H
- #include "FWMath.h"
- #endif
-
- #ifndef FWEXCLIB_H
- #include "FWExcLib.h"
- #endif
-
- #include <ctype.h>
-
- #ifdef FW_BUILD_MAC
- #pragma segment Strings
- #endif
-
- //========================================================================================
- // CLASS FW_CStringTool
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::GetTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool*& FW_CStringTool::GetTool()
- {
- const int kOffset = 166;
- FW_CStringTool **tool = (FW_CStringTool **)
- FW_CPrivTaskGlobals::GetTaskGlobals(kOffset);
- return *tool;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::GetCurrentStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool* FW_CStringTool::GetCurrentStringTool()
- {
- FW_CStringTool *&gTool = GetTool();
- if (gTool == NULL)
- gTool = FW_NEW(FW_CMinimalStringTool, ());
- return gTool;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::SetCurrentStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool*
- FW_CStringTool::SetCurrentStringTool(FW_CStringTool* tool)
- {
- FW_CStringTool *&gTool = GetTool();
- FW_CStringTool* prior = gTool;
- gTool = tool;
- return prior;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FW_CStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool::FW_CStringTool(FW_Boolean caseSensitive) :
- fCaseSensitive(caseSensitive)
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::~FW_CStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CStringTool::~FW_CStringTool()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FW_CStringTool
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::SetCaseSensitivity(FW_Boolean caseSensitive)
- {
- FW_Boolean prior = fCaseSensitive;
- fCaseSensitive = caseSensitive;
- return prior;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::ToUpper
- //----------------------------------------------------------------------------------------
-
- void FW_CStringTool::ToUpper(FW_CTextReader &input, FW_CTextWriter &output)
- {
- input.SetPosition(0);
- FW_Char c;
- while ((c=input.GetCharacterAndAdvance()) != FW_kNulCharacter)
- {
- DoConvertToUpper(&c, 1);
- output.PutCharacterAndAdvance(c);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::ToUpper
- //----------------------------------------------------------------------------------------
-
- void FW_CStringTool::ToUpper(FW_CString &string)
- {
- DoConvertToUpper((FW_Char*) string.fRepresentation, string.fLength);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::ToLower
- //----------------------------------------------------------------------------------------
-
- void FW_CStringTool::ToLower(FW_CTextReader &input, FW_CTextWriter &output)
- {
- input.SetPosition(0);
- FW_Char c;
- while ((c=input.GetCharacterAndAdvance()) != FW_kNulCharacter)
- {
- DoConvertToLower(&c, 1);
- output.PutCharacterAndAdvance(c);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::ToLower
- //----------------------------------------------------------------------------------------
-
- void FW_CStringTool::ToLower(FW_CString &string)
- {
- DoConvertToLower((FW_Char*) string.fRepresentation, string.fLength);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::CompareStrings
- //----------------------------------------------------------------------------------------
-
- FW_StringCompareResult FW_CStringTool::CompareStrings(
- const FW_CString &string1,
- const FW_CString &string2)
- {
- FW_CStringReader reader1(string1);
- FW_CStringReader reader2(string2);
- return DoCompareStrings(reader1, reader2);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindSubString
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindSubString(
- FW_CTextReader &reader,
- const FW_CString &subString,
- FW_CharacterPosition &foundPosition)
- {
- FW_CStringReader subStringReader(subString);
- return DoFindSubString(reader, subStringReader, foundPosition);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindSubString
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindSubString(
- const FW_CString &string,
- const FW_CString &subString,
- FW_CharacterPosition &foundPosition,
- FW_CharacterPosition startPosition)
- {
- FW_CStringReader stringReader(string);
- FW_CStringReader subStringReader(subString);
- stringReader.SetPosition(startPosition);
- return DoFindSubString(stringReader, subStringReader, foundPosition);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::Substitute
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::Substitute(FW_CString &string,
- const FW_CString &searchString,
- const FW_CString &substitutionString)
- {
- FW_CharacterCount position;
- FW_Boolean found = FindSubString(string, searchString, position, 0);
- if (found)
- {
- string.Delete(searchString.GetLength(), position);
- string.Insert(substitutionString, position);
- }
- return found;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindCharacter
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindCharacter(
- const FW_CString &string,
- FW_Char character,
- FW_CharacterPosition &foundPosition,
- FW_CharacterPosition startPosition,
- FW_FindDirection direction)
- {
- FW_CStringReader reader(string);
- reader.SetPosition(startPosition);
- return DoFindCharacter(reader, character, foundPosition, direction);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindWhiteSpace(
- const FW_CString &string,
- FW_CharacterPosition &foundPosition,
- FW_CharacterPosition startPosition,
- FW_FindDirection direction)
- {
- FW_CStringReader reader(string);
- reader.SetPosition(startPosition);
- return DoFindWhiteSpace(reader, foundPosition, direction);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CStringTool::FindNonWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CStringTool::FindNonWhiteSpace(
- const FW_CString &string,
- FW_CharacterPosition &foundPosition,
- FW_CharacterPosition startPosition,
- FW_FindDirection direction)
- {
- FW_CStringReader reader(string);
- reader.SetPosition(startPosition);
- return DoFindNonWhiteSpace(reader, foundPosition, direction);
- }
-
- //========================================================================================
- // CLASS FW_CMinimalStringTool
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::FW_CMinimalStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CMinimalStringTool::FW_CMinimalStringTool(FW_Boolean caseSensitive) :
- FW_CStringTool(caseSensitive)
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::~FW_CMinimalStringTool
- //----------------------------------------------------------------------------------------
-
- FW_CMinimalStringTool::~FW_CMinimalStringTool()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoCompareStrings
- //----------------------------------------------------------------------------------------
-
- FW_StringCompareResult FW_CMinimalStringTool::DoCompareStrings(
- FW_CTextReader &reader1,
- FW_CTextReader &reader2)
- {
- FW_StringCompareResult result = kStringsEqual;
-
- FW_Char c1;
- FW_Char c2;
- do
- {
- c1 = reader1.GetCharacterAndAdvance();
- c2 = reader2.GetCharacterAndAdvance();
- if (!fCaseSensitive)
- {
- DoConvertToUpper(&c1, 1);
- DoConvertToUpper(&c2, 1);
- }
- } while(c1 == c2 && c1 != FW_kNulCharacter);
-
- if (c1 < c2)
- {
- result = kStringOneLess;
- }
- else if (c1 > c2)
- {
- result = kStringOneGreater;
- }
-
- return result;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoMatchPrefixString
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoMatchPrefixString(
- FW_CTextReader &target,
- FW_CTextReader &prefix)
- {
- FW_Char t;
- FW_Char p;
-
- do
- {
- t = target.GetCharacterAndAdvance();
- p = prefix.GetCharacterAndAdvance();
- if (!fCaseSensitive)
- {
- DoConvertToUpper(&t, 1);
- DoConvertToUpper(&p, 1);
- }
- } while (p!=FW_kNulCharacter && p==t);
-
- // Either p is FW_kNulCharacter, or p!=t.
- // If p is FW_kNulCharacter, then whether p==t or p!=t, there is a prefix match.
- // If p!=t, then there is not a prefix match only if p!=FW_kNulCharacter.
- // Correct determination of match is therefore p==FW_kNulCharacter.
-
- return p==FW_kNulCharacter;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoFindSubString
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoFindSubString(
- FW_CTextReader &searchStringReader,
- FW_CTextReader &subStringReader,
- FW_CharacterPosition &foundPosition)
- {
- FW_Boolean match = FALSE;
-
- foundPosition = searchStringReader.GetPosition();
- FW_CharacterPosition lastPosition = searchStringReader.GetLength() -
- subStringReader.GetLength();
- while (foundPosition <= lastPosition)
- {
- subStringReader.SetPosition(0);
- match = DoMatchPrefixString(searchStringReader, subStringReader);
- if (match)
- break;
- searchStringReader.SetPosition(++foundPosition);
- }
-
- return match;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoFindCharacter
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoFindCharacter(
- FW_CTextReader &reader,
- FW_Char character,
- FW_CharacterPosition &foundPosition,
- FW_FindDirection direction)
- {
- if (!fCaseSensitive)
- DoConvertToUpper(&character, 1);
-
- FW_Char c;
- do
- {
- c = reader.PeekCharacter();
- if (!fCaseSensitive)
- DoConvertToUpper(&c, 1);
- if (c == character || c == FW_kNulCharacter)
- break;
- if (direction == FW_kForwards)
- reader.Advance();
- else
- reader.Backup();
- } while(1);
-
- FW_Boolean match = (c == character);
- if (match)
- foundPosition = reader.GetPosition();
-
- return match;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoFindWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoFindWhiteSpace(
- FW_CTextReader &reader,
- FW_CharacterPosition &foundPosition,
- FW_FindDirection direction)
- {
- FW_Char c = reader.PeekCharacter();
- while (!DoIsWhiteSpace(c) && c != FW_kNulCharacter)
- {
- if (direction == FW_kForwards)
- reader.Advance();
- else
- reader.Backup();
- c = reader.PeekCharacter();
- }
-
- FW_Boolean match = DoIsWhiteSpace(c);
- if (match)
- foundPosition = reader.GetPosition();
-
- return match;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CMinimalStringTool::DoFindNonWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoFindNonWhiteSpace(
- FW_CTextReader &reader,
- FW_CharacterPosition &foundPosition,
- FW_FindDirection direction)
- {
- FW_Char c = reader.PeekCharacter();
- while (DoIsWhiteSpace(c) && c != FW_kNulCharacter)
- {
- if (direction == FW_kForwards)
- reader.Advance();
- else
- reader.Backup();
- c = reader.PeekCharacter();
- }
-
- FW_Boolean match = !DoIsWhiteSpace(c);
- if (match)
- foundPosition = reader.GetPosition();
-
- return match;
- }
-
- //----------------------------------------------------------------------------------------
- // CLASS FW_CMinimalStringTool::DoIsWhiteSpace
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CMinimalStringTool::DoIsWhiteSpace(FW_Char character)
- {
- return FW_PrimitiveStringIsSpace(character);
- }
-
- //----------------------------------------------------------------------------------------
- // CLASS FW_CMinimalStringTool::DoConvertToUpper
- //----------------------------------------------------------------------------------------
-
- void FW_CMinimalStringTool::DoConvertToUpper(FW_Char *chars, FW_CharacterCount length)
- {
- #if defined FW_BYTE_CHARACTERS
- for (int i=0; i<length; i++)
- chars[i] = FW_PrimitiveStringToUpper(chars[i]);
- #else
- NotYetImplemented();
- #endif
- }
-
- //----------------------------------------------------------------------------------------
- // CLASS FW_CMinimalStringTool::DoConvertToLower
- //----------------------------------------------------------------------------------------
-
- void FW_CMinimalStringTool::DoConvertToLower(FW_Char *chars, FW_CharacterCount length)
- {
- #if defined FW_BYTE_CHARACTERS
- for (int i=0; i<length; i++)
- chars[i] = FW_PrimitiveStringToLower(chars[i]);
- #else
- NotYetImplemented();
- #endif
- }
-